package com.example.mapreducr.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * ClassName: WordCountMapper
 * Package: com.example.mapreducr.wordcount
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 * Date: 2023-07-15
 * Time: 20:20
 */

/**
 * 编写Mapper规范
 * 自定义Mapper要基础Hadoop的Mapper
 * Mapper输入参数和输出参数都是k,v
 * Mapper的业务逻辑在map()方法中 一行内容执行一次 map() (MapTask进程)
 * 重写map方法 里面是业务逻辑
 */
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private Text outK = new Text();
    //写出去的值都是(word,1)
    private IntWritable outV = new IntWritable(1);

    //输入的参数是k,v 是偏移量 和 一行的内容
    //输出的参数是 (abc,1)
    //参数是对应的 hadoop包装过的序列化参数
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //1.将MapTask传来的文本转换成String 操作String的方法多
        String text = value.toString();
        //根据文本格式分割单词 有空格 有\t
        String[] words = text.split(" ");
        //3.将单词输出为<word,1>形式
        //得到的是一个单词字符数组 循环的将单词输出为<word,1>形式
        //一行不知道有多少数据 所以进行遍历
        for (String word : words){
            //
            outK.set(word);
            //通过context写出 k v k的类型是Text v是IntWritable
            //并且是读一行 就写出一行数据
            context.write(outK,outV);
        }
    }
}
